package _11_整理题目._整理基础._集合源码;

import lombok.Data;
import org.junit.Test;

public class _clone_克隆对象 {
    
    @Data
    class SimpleObject implements Cloneable
    {
        private String str;
    
        public SimpleObject()
        {
            System.out.println("Enter SimpleObject.constructor()");
        }
        
        public Object clone() throws CloneNotSupportedException
        {
            return super.clone();
        }
    }
    
    @Test
    public void testClone1() {
        SimpleObject simpleObject0 = new SimpleObject();
        simpleObject0.setStr("1111");
        System.out.println("simpleObject0.getStr() = " + simpleObject0.getStr());
        
        // "="这个运算符，如果左右两边都是对象引用的话，在Java中表示的将等号右边的引用赋值给等号左边的引用，二者指向的还是同一块内存，
        // 所以任何一个引用对内存的操作都直接反映到另一个引用上。
        SimpleObject simpleObject1 = simpleObject0;
        simpleObject1.setStr("2222");
        System.out.println("simpleObject0.getStr() = " + simpleObject0.getStr());
        System.out.println("simpleObject1.getStr() = " + simpleObject1.getStr());
        
    }
    
    @Test
    public void testClone2() throws CloneNotSupportedException {
        SimpleObject simpleObject0 = new SimpleObject();
        simpleObject0.setStr("1111");
        System.out.println("simpleObject0.getStr() = " + simpleObject0.getStr());
        
        // 但是，现在我想拿这个so0的数据进行一些操作，不想改变原来so0中的内容，这时候就可以使用克隆了，
        // 它允许在堆中克隆出一块和原对象一样的对象，并将这个对象的地址赋予新的引用，这样，显然我对新引用的操作，不会影响到原对象。
        SimpleObject simpleObject2 = (SimpleObject) simpleObject0.clone();
        simpleObject2.setStr("3333");
        System.out.println("simpleObject0.getStr() = " + simpleObject0.getStr());
        System.out.println("simpleObject2.getStr() = " + simpleObject2.getStr());
    }
}
